Docker入门:使用Dockerfile构建Docker镜像 |
您所在的位置:网站首页 › dockerfile from多个镜像 › Docker入门:使用Dockerfile构建Docker镜像 |
一、前言 我们通过Docker build命令以及Dockerfile把我们的应用以及应用依赖的资源及环境打包成Docker镜像,帮助我们在各种我们需要的环境中部署应用,让我们不再担心环境差异带来的应用部署问题 1、本篇主要内容Docker build命令介绍Dockerfile文件及常用参数介绍Docker build+Dockerfile制作Docker镜像Docker镜像发布到公共仓库2、环境信息环境 说明 Docker Docker CE 20.10.21 Docker Desktop 4.14 Docker Golang镜像 1.19.4 Golang 1.19.4 Windows Windows 11 二、镜像制作创建镜像制作根目录,例如:d:\docker\helloworld(Windows),~/docker/helloworld(macOS),后续所有文件都放在该目录中 1、准备应用代码用golang写的一个简单http server,监听8000端口,默认输出helloworld,新建helloworld.go保存以下代码 package main import ( "fmt" "log" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { log.Println("received request from", r.RemoteAddr, r.URL.Path[1:]) var welcome = r.URL.Path[1:] if len(welcome) == 0 { welcome = "World" } fmt.Fprintf(w, "Hello, %s! ---ken.io", welcome) } func main() { http.HandleFunc("/", handler) log.Println("starting server on port 8000") log.Fatal(http.ListenAndServe(":8000", nil)) }2、编写Dockerfile文件Dockerfile 是用于Docker镜像的文本文件(无后缀名),包含所有我们需要用于创建Docker镜像的命令,例如:指定基础镜像、安装依赖的软件、配置环境变量、添加文件和目录、定义容器启动时运行的命令等 # 使用官方提供的 Go 镜像作为基础镜像 FROM golang:1.19.4 # 将工作目录设置为 /app WORKDIR /app # 将当前目录下的所有内容复制到 /app 下 COPY . /app # 允许宿主机访问容器的 8000 端口 EXPOSE 8000 # 设置容器进程为:go run helloworld.go CMD go run helloworld.go3、编译镜像文件#进入目录 d: && cd d:\docker\helloworld #编译镜像(默认为latest)(注意结尾一定要加.) docker build -t helloworld . #编译指定版本镜像(注意结尾一定要加.) docker build -t helloworld:1.0 . #查看本地镜像 docker images #镜像列表 REPOSITORY TAG IMAGE ID CREATED SIZE helloworld 1.0 c56b0d613f1a 1 minutes ago 992MB helloworld latest c56b0d613f1a 1 minutes ago 992MB注意看这里的IMAGE ID是一样的,我们虽然执行了两次Docker build,但是Dockerfile并无变化,Docker很机智的把后创建的Repository Tag指向了同一个Source Image,不信你可以看一下两次docker build命令的输出结果,writing image的sha256值是一模一样的 4、创建并启动容器#创建并启动容器(默认使用latest版本) docker run -d --name myhello -p 8000:8000 helloworld #查看已启动的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1438022c3ae4 helloworld "/bin/sh -c 'go run …" 6 seconds ago Up 5 seconds 0.0.0.0:8000->8000/tcp myhello看到helloworld的容器且状态为UP,说明容器已正常启动,此时访问 http://localhost:8000/ 将会看到HelloWorld 也可以试试访问http://localhost:8000/ken,将会看到不一样的内容 三、推送镜像到官方仓库1、注册Docker账号访问 https://hub.docker.com/signup ,注册自己的Docker账号 截图中的邮箱仅为示例,实际并不存在 2、登录Docker账号在Docker Client或者Docker Desktop中登录自己的账号,这里使用Docker Client做演示 #登录命令 docker login #根据命令号交互输入注册时的账号密码即可成功登录 Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: kentalk Password: Login Succeeded Logging in with your password grants your terminal complete access to your account. For better security, log in with a limited-privilege personal access token. Learn more at https://docs.docker.com/go/access-tokens/3、推送镜像基于已有本地Docker镜像创建符合Docker规范的Repository: {username}/{repository} docker tag helloworld kentalk/helloworld docker tag helloworld:1.0 kentalk/helloworld:1.0命令执行后再查看下本地镜像 #查看本地镜像 docker images #镜像列表 REPOSITORY TAG IMAGE ID CREATED SIZE kentalk/helloworld 1.0 c56b0d613f1a About an hour ago 992MB kentalk/helloworld latest c56b0d613f1a About an hour ago 992MB helloworld 1.0 c56b0d613f1a About an hour ago 992MB helloworld latest c56b0d613f1a About an hour ago 992MB这里注意IMAGE ID并无变化,新的Repository只是基于本地镜像的引用 推送镜像到docker hub #执行命令 docker push kentalk/helloworld #输出示例 Using default tag: latest The push refers to repository [docker.io/kentalk/helloworld] c5aba32dc2d8: Pushed 7bc6949046cf: Pushed 3b5b867f93c1: Mounted from library/golang caf157c05987: Mounted from library/golang 6424bc9210da: Mounted from library/golang b77487480ddb: Mounted from library/golang cd247c0fb37b: Mounted from library/golang cfdd5c3bd77e: Mounted from library/golang 870a241bfebd: Mounted from library/golang latest: digest: sha256:3fc3bd029a7dd0……caf7fe1601eb27424 size: 2209虽然我们本地镜像有992MB,但是推送只消耗了2209字节,这是因为我们是基于官方镜像的加工,只需要把Dockerfile上传即可,并不需要把我们本地的镜像文件完整的上传 推送完成后,可以在跟人账号https://hub.docker.com/u/kentalk页看到推送的镜像 也可以直接访问 https://hub.docker.com/r/kentalk/helloworld/tags,查看Repository下的所有Tag 这里可以通过Manage Repository修改镜像介绍等,也可以在Overview查看镜像介绍等信息,这里就不再赘述 4、获取远端镜像删除本地kentalk开头镜像 docker image rm kentalk/helloworld:latest docker image rm kentalk/helloworld:1.0停用并删除已有helloworld容器 docker stop myhello docker rm myhello从远端拉取镜像并启动kentalk/helloworld容器 #执行命令 docker run -d --name myhello -p 8000:8000 kentalk/helloworld #输出内容 Unable to find image 'kentalk/helloworld:latest' locally latest: Pulling from kentalk/helloworld Digest: sha256:3fc3bd029a7dd0011ff97c4e2c108296701342c0452886fcaf7fe1601eb27424 Status: Downloaded newer image for kentalk/helloworld:latest 8b7da7d0cc249d00b46739b83d597d27b9c665307a74e42fde8ac5fe67b7edf4查看镜像运行情况 #查看所有容器 docker ps -a #容器List CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8b7da7d0cc24 kentalk/helloworld "/bin/sh -c 'go run …" About a minute ago Up About a minute 0.0.0.0:8000->8000/tcp myhello访问 http://localhost:8000/ken 将会看到: 四、备注1、Docker build常用参数参数 说明 -t 指定Repository以及Tag,例如helloworld:1.0 -f 指定Dockerfile路径,Dockerfile不在当前目录时使用 —no-cache 常见镜像的过程中不使用Build Cache构建镜像 —pull 构建镜像时总是拉取Base Image的最新版本 2、Dockerfile常用指令指令 描述 FROM 指定基础镜像,可以指定多个,指定多个基础镜像时,编译时也会生成对应的多个镜像 MAINTAINER 指定镜像维护人信息,制作人根据自己情况指定 WORKDIR 设置工作目录,后续的RUN、COPY、CMD等命令都将在工作目录下运行 RUN 构建镜像时运行命令,可以用他安装软件等等 COPY 拷贝文件或目录到镜像中 ADD 拷贝文件或目录到镜像中,如果源文件是gizp等压缩文件,会被自动解压到目标目录 ENV 设置环境变量 USER 为RUN、CMD 和 ENTRYPOINT 执行命令指定运行用户 ARG 由外部启动时必须传入的参数,在容器启动时用–build-arg传递参数 EXPOSE 声明容器暴露给宿主机的端口,可以是一个或者多个以空格间隔 HEALTHCHECK 容器中服务健康检查 VOLUME 用于指定持久化目录 CMD 运行容器时执行,启动的进程会作为容器的主进程,如果有多个CMD指令,如果指定了多个,最后一个生效,这种机制保障了我们基于Base Image制作镜像时可以运行自己想要的程序作为容器主进程 ENTRYPOINT 运行容器时执行,如果有多个 ENTRYPOINT 命令,作用相当于CMD,可以执行比CMD更复杂的命令,如果指定了多个,只有最后一个生效 3、本文参考https://docs.docker.com/get-started/02_our_app/https://docs.docker.com/engine/reference/builder/https://yeasy.gitbook.io/docker_practice/image/dockerfile系列名称:Docker入门教程上一篇:Docker入门:Docker安装与基本使用下一篇:Docker入门:使用数据卷、文件挂载进行数据存储与共享 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |